/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package data;

import java.text.ParseException;

/**
 *
 * @author
 * PedroLZ
 */
public class Dinheiro 
{
	public static int UM_REAL_EM_CENTAVOS = 100;
	private int grana = 0;

	public Dinheiro() {}

	public Dinheiro(int reais, int centavos) {
		this.grana = toIntDinheiro( reais, centavos );
	}

	public Dinheiro(String strDinheiro) throws ParseException {
		this.grana = toIntDinheiro( strDinheiro );
	}

	public void set(String strDinheiro) throws ParseException {
		this.grana = toIntDinheiro( strDinheiro );
	}
	
	public int getReais() {
		if( grana == 0 ) 
			return 0;
		return (int)grana/UM_REAL_EM_CENTAVOS;
	}

	public void setReais(int reais) {
		grana = toIntDinheiro( reais, getCentavos() );
	}
	
	public int getCentavos() {
		if( grana == 0 ) 
			return 0;
		return grana%UM_REAL_EM_CENTAVOS;
	}

	public void setCentavos(int centavos) {
		grana = toIntDinheiro( getReais(), centavos );
	}
	
	public void add( String strDinheiro ) throws ParseException {
		grana += toIntDinheiro( strDinheiro );
	}
	
	public void addReais(int reais) {
		grana = toIntDinheiro( getReais() + reais, getCentavos() );
	}
	
	public void addCentavos(int centavos) {
		grana = toIntDinheiro( getReais(), getCentavos() + centavos );
	}
	
	public void retira( String strDinheiro ) throws ParseException {
		grana -= toIntDinheiro( strDinheiro );
	}
	
	public void retiraReais(int reais) {
		grana = toIntDinheiro( getReais() - reais, getCentavos() );
	}
	
	public void retiraCentavos(int centavos) {
		grana = toIntDinheiro( getReais(), getCentavos() - centavos );
	}
	
	public int compareTo(Dinheiro dinheiro) {
		return (this.grana - toIntDinheiro( dinheiro.getReais(), dinheiro.getCentavos() ));
	}
	
	public boolean isMaiorQue(Dinheiro dinheiro) {
		return( this.compareTo(dinheiro) > 0 );
	}
	
	public boolean isMenorQue(Dinheiro dinheiro) {
		return( this.compareTo(dinheiro) < 0 );
	}
	
	public void multiplica(double valor) {
		this.grana *= valor;
	}
	
	public Dinheiro getValorVezes(double valor)
	{
		Dinheiro percent = this.clone();
		percent.multiplica(valor);
		return( percent );
	}	
	
	private int toIntDinheiro(int reais, int centavos){
		return( reais*UM_REAL_EM_CENTAVOS + centavos );
	}

	private int toIntDinheiro(String strDinheiro) throws ParseException
	{
		if( !isDinheiroValido(strDinheiro) )
			throw new ParseException("Erro: Valor inválido para dinheiro.", -1);
		
		boolean informouCentavos = ( strDinheiro.indexOf(".") > 0 );

		if( informouCentavos )
		{
			String[] valores = strDinheiro.split("\\.");
			return toIntDinheiro( Integer.parseInt(valores[0]), Integer.parseInt(valores[1]) );
		}
		else
			return toIntDinheiro( Integer.parseInt(strDinheiro), 0 );
	}
	
	private boolean isDinheiroValido(String str) {
		return str.matches("[0-9]+(\\.[0-9]{1,2})?");
	}

	@Override
	public String toString() {
		return getReais() + "." + getCentavos();
	}

	@Override
	public boolean equals(Object obj) 
	{
		if( this == obj )
			return true;
		if( obj == null )
			return false;
		if( getClass() != obj.getClass() )
			return false;
		
		final Dinheiro other = (Dinheiro) obj;
		
		if (this.grana != other.grana)
			return false;
		
		return true;
	}

	@Override
	public int hashCode() {
		int hash = 7;
		hash = 89 * hash + this.grana;
		return hash;
	}
	
	@Override
	public Dinheiro clone(){
		Dinheiro dinheiro = new Dinheiro();
		dinheiro.setReais( getReais() );
		dinheiro.setCentavos( getCentavos() );
		return dinheiro;
	}
}
